{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Домашнее задание к лекции «Объекты и классы. Инкапсуляция, наследование и полиморфизм»\n",
    "\n",
    "## Задание № 2. Наследование\n",
    "\n",
    "В квизе к предыдущей лекции мы реализовали возможность выставлять студентам оценки за домашние задания. Теперь это могут делать только Reviewer (реализуйте такой метод)! А что могут делать лекторы? Получать оценки за лекции от студентов :) Реализуйте метод выставления оценок лекторам у класса Student (оценки по 10-балльной шкале, хранятся в атрибуте-словаре у Lecturer, в котором ключи – названия курсов, а значения – списки оценок). Лектор при этом должен быть закреплен за тем курсом, на который записан студент."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 380,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Student:\n",
    "    def __init__(self, name, surname, gender='man'):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.gender = gender\n",
    "        self.finished_courses = []\n",
    "        self.courses_in_progress = []\n",
    "        self.grades = {}\n",
    "# Реализуем метод выставления оценок лекторам\n",
    "    def rate_lecturer(self, lecturer, course, grade):\n",
    "        if isinstance(lecturer, Lecturer) and course in lecturer.courses_attached and course in self.courses_in_progress:\n",
    "            if course in lecturer.grades_lectors:\n",
    "                lecturer.grades_lectors[course] += [grade]\n",
    "            else:\n",
    "                lecturer.grades_lectors[course] = [grade]\n",
    "        else:\n",
    "            return 'Ошибка'\n",
    "    \n",
    "class Mentor:\n",
    "    def __init__(self, name, surname):\n",
    "        self.name = name\n",
    "        self.surname = surname\n",
    "        self.courses_attached = []\n",
    "\n",
    "class Lecturer(Mentor):\n",
    "    def __init__(self, name, surname):\n",
    "        super().__init__(name, surname)\n",
    "        self.grades_lectors = {}\n",
    "    \n",
    "    # Форматируем строку метода\n",
    "    def __str__(self):\n",
    "        f_string = f'Имя лектора: {self.name}; Фамилия лектора: {self.surname}'\n",
    "        return f_string \n",
    "\n",
    "class Reviewer(Mentor):\n",
    "    def __init__(self, name, surname):\n",
    "        super().__init__(name, surname)\n",
    "\n",
    "    # Реализуем метод выставления оценок студентам    \n",
    "    def rate_hw(self, student, course, grade):\n",
    "        if isinstance(student, Student) and course in self.courses_attached and course in student.courses_in_progress:\n",
    "            if course in student.grades:\n",
    "                student.grades[course] += [grade]\n",
    "            else:\n",
    "                student.grades[course] = [grade]\n",
    "        else:\n",
    "            return 'Ошибка'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 381,
   "metadata": {},
   "outputs": [],
   "source": [
    "# У нас учатся два студента\n",
    "Student_1 = Student('Boris', 'Ivanov', )\n",
    "Student_2 = Student('Julia', 'Petrova', 'woman')\n",
    "# На курсах преподают два преподавателя\n",
    "Mentor_1 = Mentor('Steve', 'Jobs')\n",
    "Mentor_2 = Mentor('Bill', 'Gates')\n",
    "# Пусть первый преподаватель будет лектором\n",
    "Lecturer_1 = Lecturer('Steve', 'Jobs')\n",
    "# Закрепим за ним два курса\n",
    "Lecturer_1.courses_attached += (['Git'])\n",
    "Lecturer_1.courses_attached += (['Python']) \n",
    "# Пусть второй преподаватель будет проверяющим\n",
    "Reviewer_1 = Reviewer('Bill', 'Gates')\n",
    "# Закрепим за ним два курса\n",
    "Reviewer_1.courses_attached += (['Python']) \n",
    "Reviewer_1.courses_attached += (['Git']) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 382,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Проверяющие выставляют оценки студентам\n",
    "Student_1.courses_in_progress += ['Python']\n",
    "Student_2.courses_in_progress += ['Git']\n",
    "\n",
    "Reviewer_1.rate_hw(Student_1, 'Python', 5)\n",
    "Reviewer_1.rate_hw(Student_1, 'Python', 10)\n",
    "Reviewer_1.rate_hw(Student_1, 'Python', 8)\n",
    "Reviewer_1.rate_hw(Student_2, 'Git', 10)\n",
    "Reviewer_1.rate_hw(Student_2, 'Git', 10)\n",
    "Reviewer_1.rate_hw(Student_2, 'Git', 8)\n",
    "Reviewer_1.rate_hw(Student_2, 'Git', 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 383,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Python': [5, 10, 8]}\n",
      "{'Git': [10, 10, 8, 10]}\n",
      "{'Python': [8], 'Git': [10]}\n",
      "Имя лектора: Steve; Фамилия лектора: Jobs\n"
     ]
    }
   ],
   "source": [
    "# Студены выставляют оценки лектору\n",
    "Student_1.rate_lecturer(Lecturer_1, 'Python', 8)\n",
    "# Студент пытается выставить оценку по курсу Git, хотя обучается на Python - оценка не проходит\n",
    "Student_1.rate_lecturer(Lecturer_1, 'Git', 6)\n",
    "# Студент пытается выставить оценку по курсу Python, хотя обучается на Git - оценка не проходит\n",
    "Student_2.rate_lecturer(Lecturer_1, 'Python', 9)\n",
    "Student_2.rate_lecturer(Lecturer_1, 'Git', 10)\n",
    "print(Student_1.grades)\n",
    "print(Student_2.grades)\n",
    "print(Lecturer_1.grades_lectors)\n",
    "print(Lecturer_1)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10.7 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.7"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
